﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using iNet.IO;

namespace iNet.Media.Video
{
	/// <summary>
	/// 提供影片相關功能。
	/// </summary>
	public static class VideoUtility
	{
		#region GetVideoFileCount
		/// <summary>
		/// 取得指定目錄中所有支援的影片數量。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <returns>目錄中的影片數量。</returns>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		/// <exception cref="ArgumentNullException">directory 為 Null (Visual Basic 為 Nothing)。</exception>
		public static int GetVideoFileCount(string directory)
		{
			return GetVideoFileCount(directory, null);
		}
		/// <summary>
		/// 取得指定目錄中的影片數量。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <param name="format">指定的影片格式，Null (Visual Basic 為 Nothing) 表示所有解碼器支援的格式。</param>
		/// <returns>目錄中的影片數量。</returns>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		/// <exception cref="ArgumentNullException">directory 為 Null (Visual Basic 為 Nothing)。</exception>
		public static int GetVideoFileCount(string directory, IMediaFormat format)
		{
			return GetVideoFileNames(directory, format).Length;
		}
		#endregion
		#region GetVideoFileNames
		/// <summary>
		/// 取得指定目錄中的所有支援的影片檔案路徑。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <returns>表示影片檔案路徑的字串陣列。</returns>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		/// <exception cref="ArgumentNullException">directory 為 Null (Visual Basic 為 Nothing)。</exception>
		public static string[] GetVideoFileNames(string directory)
		{
			return GetVideoFileNames(directory, null);
		}
		/// <summary>
		/// 取得指定目錄中的影片檔案路徑。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <param name="format">指定的影片格式，Null (Visual Basic 為 Nothing) 表示所有解碼器支援的格式。</param>
		/// <returns>表示影片檔案路徑的字串陣列。</returns>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		/// <exception cref="ArgumentNullException">directory 為 Null (Visual Basic 為 Nothing)。</exception>
		public static string[] GetVideoFileNames(string directory, IMediaFormat format)
		{
			//確認
			if (directory == null)
				throw new ArgumentNullException("directory");
			if (!FileUtility.IsValidPath(directory))
				throw new ArgumentException();

			//取得檔案路徑
			HashSet<string> fileNames = new HashSet<string>(PathComparer.Default);
			if (format == null)		//=====取得所有支援的格式=====
			{
				foreach (string extension in VideoCodecs.GetDecodingFormatFileNameExtensions())
				{
					try
					{
						string[] fileNameArray = Directory.GetFiles(directory, "*" + extension);
						for (int i = 0, count = fileNameArray.Length; i < count; i++)
							fileNames.Add(fileNameArray[i]);
					}
					catch (DirectoryNotFoundException ex)
					{
						break;
					}
					catch (UnauthorizedAccessException ex)
					{
						break;
					}
					catch
					{ }
				}
			}
			else					//=====取得指定的格式=====
			{
				//取得支援的副檔名
				string[] extensions;
				try
				{
					extensions = format.FileNameExtensions;
				}
				catch
				{
					return new string[0];
				}

				//取得影片檔案
				for (int i = 0, count = extensions.Length; i < count; i++)
				{
					try
					{
						string[] fileNameArray = Directory.GetFiles(directory, "*" + extensions[i]);
						for (int j = 0, length = fileNameArray.Length; j < length; j++)
							fileNames.Add(fileNameArray[j]);
					}
					catch (DirectoryNotFoundException ex)
					{
						break;
					}
					catch (UnauthorizedAccessException ex)
					{
						break;
					}
					catch
					{ }
				}
			}

			//回傳
			string[] array = new string[fileNames.Count];
			fileNames.CopyTo(array, 0);
			return array;
		}
		#endregion
		#region GetVideoFiles
		/// <summary>
		/// 取得指定目錄中的影片檔案資訊。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <returns>包含影片檔案資訊的 System.IO.FileInfo 陣列。</returns>
		/// <exception cref="ArgumentNullException">directory 參數值為 Null (Visual Basic 為 Nothing)。</exception>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		public static FileInfo[] GetVideoFiles(string directory)
		{
			return GetVideoFiles(directory, null);
		}
		/// <summary>
		/// 取得指定目錄中指定格式的影片檔案資訊。
		/// </summary>
		/// <param name="directory">指定的目錄。</param>
		/// <param name="format">指定的影片格式，Null (Visual Basic 為 Nothing) 表示所有解碼器支援的格式。。</param>
		/// <returns>包含影片檔案資訊的 System.IO.FileInfo 陣列。</returns>
		/// <exception cref="ArgumentNullException">directory 參數值為 Null (Visual Basic 為 Nothing)。</exception>
		/// <exception cref="ArgumentException">無效的目錄路徑。</exception>
		public static FileInfo[] GetVideoFiles(string directory, IMediaFormat format)
		{
			//取得檔案名稱
			string[] fileNames = GetVideoFileNames(directory, format);

			//建立物件
			int count = fileNames.Length;
			FileInfo[] fileInfos = new FileInfo[count];
			for (int i = count - 1; i >= 0; i--)
				fileInfos[i] = new FileInfo(fileNames[i]);

			//回傳
			return fileInfos;
		}
		#endregion	
	}
}
